package main

import (
	"fmt"
	"time"
)

func main() {
	selectRoutine()
	selectTimeout()
	selectDefault()
}

/**
select应用举例
*/
func selectRoutine() {
	c1 := make(chan string)
	c2 := make(chan string)
	go func() {
		time.Sleep(time.Second * 1)
		c1 <- "one"
	}()
	go func() {
		time.Sleep(time.Second * 2)
		c2 <- "two"
	}()
	for i := 0; i < 2; i++ {
		select {
		case msg1 := <-c1:
			fmt.Println("received", msg1)
		case msg2 := <-c2:
			fmt.Println("received", msg2)
		}
	}
}

/**
select timeout 应用举例
*/
func selectTimeout() {
	c1 := make(chan string)
	go func() {
		time.Sleep(time.Second * 2)
		c1 <- "one"
	}()
	select {
	case res := <-c1:
		fmt.Println(res)
	case <-time.After(time.Second * 1):
		fmt.Println("timeout 1")
	}
}

/**
select default 不阻塞
*/
func selectDefault() {
	msg := make(chan string)
	select {
	case m := <-msg:
		fmt.Println("received msg :", m)
	default:
		fmt.Println("no message received")
	}
	fmt.Println("select default done!")
}
